package com.mtnz.njk.Service;

import com.mtnz.njk.Mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.cache.annotation.Caching;
import org.springframework.stereotype.Service;

/**
 * @Description: 测试注解
 * @Author: FBL
 * @CreateDate: 2019\8\26 0026 11:48
 * @Version: 1.0
 */
@Service
public class ManageService {
    @Autowired
    UserMapper userMapper;

    // 需要注意的是当一个支持缓存的方法在对象内部被调用时是不会触发缓存功能的
    // SpringEL（spEL）  表达式
    // unless表达式是在方法调用之后进行评估的。如果返回false，才放入缓存（与condition相反）
    // 属性condition支持这种功能，通过SpEL 表达式来指定可求值的boolean值，为true才会缓存（在方法执行之前进行评估）。
    @Cacheable(cacheNames = "user", key = "#userId", unless = "#result == null ", condition = "#userId != null")
    public String getUserById(String userId) {
        return userMapper.queryUserById(userId);
    }

    // @CachePut标注的方法在执行前不会去检查缓存中是否存在之前执行过的结果，而是每次都会执行该方法，并将执行结果以键值对的形式存入指定的缓存中。
    // 应该避免@CachePut 和 @Cacheable同时使用的情况。
    @CachePut(cacheNames = "user", key = "#userId")
    public String updateUserById(String userId, String nickName) {
        return "范保林";
    }

    // @CacheEvict是用来标注在需要清除缓存元素的方法或类上的。当标记在一个类上时表示其中所有的方法的执行都会触发缓存的清除操作。
    // 当指定了allEntries为true时，Spring Cache将忽略指定的key。有的时候我们需要Cache一下清除所有的元素，这比一个一个清除元素更有效率。
    // 使用beforeInvocation可以改变触发清除操作的时间，当我们指定该属性值为true时，Spring会在调用该方法之前清除缓存中的指定元素。
    @CacheEvict(cacheNames = "user", key = "#userId", allEntries = false, beforeInvocation = false)
    @Caching
    public void delUserById(String userId) {

    }

}
